#include "World.h"

World::World()
{

}
void World::Add_GO(GO obj)
{
    GOs.append(obj);
}
GO* World::Return_GO(int index)
{
    return &GOs[index];
}

int World::Return_GOs_Count()
{
    return GOs.count();
}

void World::Drawing_World(QString path)
{
    int i,j,k;
    QSvgGenerator generator;
    QPainter painter;
    QPen pen;

    /* создание файла SVG */
    generator.setFileName(path);
    generator.setSize(QSize(GO_Width,GO_Height));
    generator.setViewBox(QRect(0, 0, GO_Width,GO_Height));
    generator.setTitle(GO_Name);

    /* начало рисования */
    painter.begin(&generator);
    painter.drawRect(QRect(GO_Base_Point.x() - GO_Width/2, GO_Base_Point.y() - GO_Height/2, GO_Width, GO_Height));

    /* вывод объектов, имеющих площадь */

    for(i = 0; i < GOs.count();i++)
    {
        if(GOs[i].Get_GO_Type() == "река" || GOs[i].Get_GO_Type() == "дорога" || GOs[i].Get_GO_Type() == "горы" || GOs[i].Get_GO_Type() == "скалы")
        {           
            if(GOs[i].Get_GO_Type() == "скалы" || GOs[i].Get_GO_Type() == "горы")
            {
                int del = 10;
                int angle;
                double mn;
                int dif_x,dif_y,offset_x,offset_y;
                for(j = 0; j < GOs[i].Return_GO_Points_Count()-1; j++)
                {
                    dif_x = GOs[i].Return_GO_Point(j+1).x() - GOs[i].Return_GO_Point(j).x();
                    dif_y = GOs[i].Return_GO_Point(j+1).y() - GOs[i].Return_GO_Point(j).y();

                    if(dif_x > 0 && dif_y == 0)
                    {
                        angle = 0;
                        mn = 1;
                    }
                    if(dif_x > 0 && dif_y < 0)
                    {
                        angle = 45;
                        mn = sqrt(2);
                    }
                    if(dif_x == 0 && dif_y < 0)
                    {
                        angle = 90;
                        mn = 1;
                    }
                    if(dif_x < 0 && dif_y < 0)
                    {
                        angle = 135;
                        mn = sqrt(2);
                    }
                    if(dif_x < 0 && dif_y == 0)
                    {
                        angle = 180;
                        mn = 1;
                    }
                    if(dif_x < 0 && dif_y > 0)
                    {
                        angle = 225;
                        mn = sqrt(2);
                    }
                    if(dif_x == 0 && dif_y > 0)
                    {
                        angle = 270;
                        mn = 1;
                    }
                    if(dif_x > 0 && dif_y > 0)
                    {
                        angle = 315;
                        mn = sqrt(2);
                    }

                    offset_x =  qAbs(dif_x)*mn/del;
                    offset_y =  qAbs(dif_y)*mn/del;

                    QPoint arc_start;


                    for(k = 0; k < qMax(offset_x,offset_y) + 1; k++)
                    {
                        arc_start = GOs[i].Return_GO_Point(j);

                        if(dif_x!=0)
                        {
                            arc_start.setX((int)(arc_start.x()+k*del*dif_x/(qAbs(dif_x)*mn)));
                        }
                        if(dif_y!=0)
                        {
                            arc_start.setY((int)(arc_start.y()+k*del*dif_y/(qAbs(dif_y)*mn)));
                        }

                        QVector <QPoint> for_pol;

                        /* ГОРА */
                        QPoint us_p;
                        us_p = arc_start;
                        us_p.setX(arc_start.x()-5);
                        for_pol.append(us_p);
                        us_p.setX(arc_start.x()+5);
                        for_pol.append(us_p);
                        us_p.setX(arc_start.x());
                        us_p.setY(arc_start.y()-7);
                        for_pol.append(us_p);
                        QPolygon pol(for_pol);
                        QPainterPath p;
                        p.addPolygon(pol);

                        painter.fillPath(p,QBrush(Qt::gray));
                    }
                }
            }
            else
            {
                if(GOs[i].Get_GO_Type() == "река")
                {
                    pen.setWidth(4);
                    pen.setColor(Qt::blue);
                    painter.setPen(pen);
                }
                if(GOs[i].Get_GO_Type() == "дорога")
                {
                    pen.setWidth(2);
                    pen.setColor(Qt::yellow);
                    painter.setPen(pen);
                }
                for(j = 0; j < GOs[i].Return_GO_Points_Count()-1; j++)
                {
                    painter.drawLine(GOs[i].Return_GO_Point(j),GOs[i].Return_GO_Point(j+1));
                }
            }
        }
        if(GOs[i].Get_GO_Type() == "озеро" || GOs[i].Get_GO_Type() == "болото" || GOs[i].Get_GO_Type() == "лес")
        {
            QPainterPath p;
            p.addEllipse(GOs[i].Get_GO_Base_Point(),GOs[i].Get_GO_Width()/2,GOs[i].Get_GO_Height()/2);
            if(GOs[i].Get_GO_Type() == "озеро")
            {
                painter.fillPath(p,QBrush(Qt::blue));
            }
            if(GOs[i].Get_GO_Type() == "болото")
            {
                painter.fillPath(p,QBrush(Qt::darkGreen));
            }
            if(GOs[i].Get_GO_Type() == "лес")
            {
                painter.fillPath(p,QBrush(Qt::green));
            }
        }    
    }

    /* вывод имен и точечных объектов после площадных и протяженных, чтобы они их не закрыли */

    for(i = 0; i < GOs.count();i++)
    {
        pen.setWidth(3);
        pen.setColor(Qt::black);
        painter.setPen(pen);
        if(GOs[i].Get_GO_Type() == "город" || GOs[i].Get_GO_Type() == "место")
        {
             painter.drawPoint(GOs[i].Get_GO_Base_Point());
        }

        QPoint text_p;

        if(GOs[i].Get_GO_Type() == "место" || GOs[i].Get_GO_Type() == "город")
        {
            text_p.setY(GOs[i].Get_GO_Base_Point().y()+7);
            if(GOs[i].Get_GO_Type() == "место")
            {
                text_p.setX(GOs[i].Get_GO_Base_Point().x()-4*GOs[i].Get_GO_Name().length()/2);
                painter.drawText(text_p,GOs[i].Get_GO_Name());
            }
            else
            {
                text_p.setX(GOs[i].Get_GO_Base_Point().x()-4*(GOs[i].Get_GO_Type() + GOs[i].Get_GO_Name()).length()/2);
                painter.drawText(text_p,GOs[i].Get_GO_Type()+ " " + GOs[i].Get_GO_Name());
            }
        }
        else
        {
            text_p.setX(GOs[i].Get_GO_Base_Point().x()-4*(GOs[i].Get_GO_Type() + GOs[i].Get_GO_Name()).length()/2);
            text_p.setY(GOs[i].Get_GO_Base_Point().y());
            painter.drawText(text_p,GOs[i].Get_GO_Type()+ " " + GOs[i].Get_GO_Name());
        }
    }

    /* вывод легенды карты */

    /* прямоугольник для легенды */
    painter.drawRect(GO_Width-60,0,60,100);

    /* вывод условных обозначений */
    painter.fillRect(GO_Width-55,5,10,10,Qt::green);
    painter.fillRect(GO_Width-55,20,10,10,Qt::darkGreen);
    painter.fillRect(GO_Width-55,35,10,10,Qt::blue);

    pen.setWidth(4);
    pen.setColor(Qt::blue);
    painter.setPen(pen);
    painter.drawLine(GO_Width-55,55,GO_Width-45,55);


    pen.setWidth(2);
    pen.setColor(Qt::yellow);
    painter.setPen(pen);
    painter.drawLine(GO_Width-55,65,GO_Width-45,65);

    QVector <QPoint> for_pol;
    QPoint us_p;
    us_p.setX(GO_Width-55);
    us_p.setY(80);
    for_pol.append(us_p);
    us_p.setX(GO_Width-50);
    us_p.setY(70);
    for_pol.append(us_p);
    us_p.setX(GO_Width-45);
    us_p.setY(80);
    for_pol.append(us_p);
    QPolygon pol(for_pol);
    QPainterPath p;
    p.addPolygon(pol);
    painter.fillPath(p,QBrush(Qt::gray));

    pen.setColor(Qt::black);
    painter.setPen(pen);
    painter.drawText(GO_Width-47,90,"Легенда");
    painter.drawText(GO_Width-40,10," - лес");
    painter.drawText(GO_Width-40,25," - болото");
    painter.drawText(GO_Width-40,40," - озеро");
    painter.drawText(GO_Width-40,58," - река");
    painter.drawText(GO_Width-40,68," - дорога");
    painter.drawText(GO_Width-40,78," - гора");

    painter.end();
}

